}
vpit->inject_point = NOW();
- vpit->last_pit_gtime += vpit->period;
+ vpit->last_pit_gtime += vpit->period_cycles;
svm_set_guest_time(v, vpit->last_pit_gtime);
}
{
struct hvm_virpit *vpit = &v->domain->arch.hvm_domain.vpit;
- v->domain->arch.hvm_domain.guest_time = svm_get_guest_time(v);
- if ( vpit->first_injected )
+ if ( vpit->first_injected && !v->domain->arch.hvm_domain.guest_time ) {
+ v->domain->arch.hvm_domain.guest_time = svm_get_guest_time(v);
stop_timer(&(vpit->pit_timer));
+ }
}
static void svm_ctxt_switch_from(struct vcpu *v)
svm_stts(v);
/* pick up the elapsed PIT ticks and re-enable pit_timer */
- if ( vpit->first_injected) {
- svm_set_guest_time(v, v->domain->arch.hvm_domain.guest_time);
+ if ( vpit->first_injected ) {
+ if ( v->domain->arch.hvm_domain.guest_time ) {
+ svm_set_guest_time(v, v->domain->arch.hvm_domain.guest_time);
+ v->domain->arch.hvm_domain.guest_time = 0;
+ }
pickup_deactive_ticks(vpit);
}
ASSERT(!test_bit(ARCH_HVM_IO_WAIT, &v->arch.hvm_vcpu.ioflags));
}
-
void svm_launch_fail(unsigned long eflags)
{
BUG();